package com.soft.service;

import java.util.List;
import java.util.Map;

import com.soft.entity.Kanban;
import com.soft.entity.KanbanColumn;
import com.soft.entity.KanbanItem;

/**
 * 看板服务：看板/列/卡片的增删改查与移动，及与日程状态的双向联动。
 */
public interface KanbanService {
    
    /**
     * 获取所有看板
     */
    List<Kanban> getAllKanbans();
    
    /**
     * 获取团队的所有看板
     */
    List<Kanban> getKanbansByTeamId(Integer teamId);
    
    /**
     * 获取用户相关的所有看板（包括用户创建的和用户所在团队的看板）
     */
    List<Kanban> getKanbansByUserId(Integer userId);
    
    /**
     * 创建新看板
     */
    Kanban createKanban(Kanban kanban);
    
    /**
     * 获取看板详情（包含列和卡片）
     */
    Map<String, Object> getKanbanDetail(Integer kanbanId);
    
    /**
     * 添加看板列
     */
    KanbanColumn addColumn(KanbanColumn column);
    
    /**
     * 移动卡片
     */
    void moveItem(Integer itemId, Integer newColumnId, Integer newSortOrder);
    
    /**
     * 添加任务卡片
     */
    KanbanItem addItem(KanbanItem item);
    
    /**
     * 获取用户管理的团队看板
     */
    List<Kanban> getManagedKanbans(Integer userId);
    
    /**
     * 获取用户参加的团队看板（非管理员）
     */
    List<Kanban> getJoinedKanbans(Integer userId);
    
    /**
     * 分配任务
     */
    void assignItem(Integer itemId, Integer assigneeId);

    /**
     * 根据日程状态，同步对应卡片到目标列（如：todo→待办，doing→进行中，done→已完成）。
     * 若未能按列名匹配，则按列顺序回退（todo→第1列，doing→第2列，done→最后一列）。
     */
    void syncItemColumnWithStatus(Integer scheduleId, String status);
    
    /**
     * 删除看板
     */
    void deleteKanban(Integer kanbanId);

    /**
     * 删除看板列（同时删除该列下的卡片），并重排同看板剩余列的排序号。
     */
    void deleteColumn(Integer columnId);

    /**
     * 更新看板名称与描述（任意非空字段生效）。
     */
    void updateKanban(Integer kanbanId, String kanbanName, String description);
    
    /**
     * 根据日程ID删除相关的看板项
     */
    void removeItemByScheduleId(Integer scheduleId);
}
